Viac SQL prikazov naraz

Otázka od: Ludo Fulop

9. 11. 2002 19:15

zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
ale nic nefungovalo  
dik
Ludo Fulop

Odpovedá: Jan Sebelík

10. 11. 2002 12:06

> Odesílatel: Ludo Fulop <kexo@ynet.sk>
> zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
> skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
> ale nic nefungovalo  

Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.

Pokud chces vice prikazu, musis si to nejak zprogramovat sam - nic tezkeho:

procedure ExecSQLScript(SQL:TStrings)
a tady z SQL.Text vyseparujes jednotlive prikazy treba tak, ze najdes priskusny
separator, treba ";", jednotlivy prikaz nacpes do ADOQuery.SQL a provedes
ADOQuery.ExecSQL.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Blazek Jaroslav

10. 11. 2002 16:52

Ahoj,

> honza@haes.cz 10.11.02 11:44 >>>
> Odesílatel: Ludo Fulop <kexo@ynet.sk>
> zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
> skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
> ale nic nefungovalo  

>Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.

tak to neni pravda

ja bezne pouzivam ADOQuery nad MSSQL, kde mam vice selectu, insertu nebo
update....jen se musi spravne skombinovat
ty co vraci DataSet musi byt jen s temi co vraci DataSet a naopak
a je to daleko rychlejsi, kdyz to poslu vsechno naraz nez to delat v nejakem
cyklu

takze v klidu muzu pouzit

ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add('SELECT * FROM Tabulka1');
ADOQuery.SQL.Add('SELECT * FROM Tabulka2');
ADOQuery.SQL.Add('SELECT * FROM Tabulka3');
ADOQuery.Open();

prvni SELECT mas normalne v DataSource.DataSet a ostatni dostanes pomoci metody
NextRecordset()

nebo treba

ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add(Format('INSERT INTO Tabulka1 (Col1, Col2) VALUES %d, ''%s'')',
[10, 'Nejaky text']));
ADOQuery.SQL.Add(Format('UPDATE Tabulka2 SET Col1 = %d WHERE IdTabulka2 = %d',
[10000, 123]));
ADOQuery.ExecSQL();


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Lstiburek Pavel

11. 11. 2002 10:11

Pozor,
TADO..., nevykonna "jeden prikaz po druhem", ale vytvori si docasnou
ulozenou proceduru a tu spusti (podobne to funguje kdyz tam das parametry),
coz zejmena pri vytvareni objektu muze celkem dost zmenit vysledek.
Pribyde totiz jeste jedna vrstva tzv. implicitnich transakci a nektere
objekty ji nemusi prezit.
Pavel

From: Blazek Jaroslav [mailto:Jaroslav.Blazek@access-it.cz]
> honza@haes.cz 10.11.02 11:44 >>>
> Odesílatel: Ludo Fulop <kexo@ynet.sk>
> zdravim, ako do ADOQuery.SQL vlozit viac SQL prikazov?
> skusal som dat do kazdeho riadku jeden, oddelovat medzerou, bodkociarkou,
> ale nic nefungovalo  

>Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.

tak to neni pravda

ja bezne pouzivam ADOQuery nad MSSQL, kde mam vice selectu, insertu nebo
update....jen se musi spravne skombinovat
ty co vraci DataSet musi byt jen s temi co vraci DataSet a naopak
a je to daleko rychlejsi, kdyz to poslu vsechno naraz nez to delat v nejakem
cyklu

takze v klidu muzu pouzit

ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add('SELECT * FROM Tabulka1');
ADOQuery.SQL.Add('SELECT * FROM Tabulka2');
ADOQuery.SQL.Add('SELECT * FROM Tabulka3');
ADOQuery.Open();

prvni SELECT mas normalne v DataSource.DataSet a ostatni dostanes pomoci
metody NextRecordset()

nebo treba

ADOQuery.Close();
ADOQuery.SQL.Clear();
ADOQuery.SQL.Add(Format('INSERT INTO Tabulka1 (Col1, Col2) VALUES %d,
''%s'')',
[10, 'Nejaky text']));
ADOQuery.SQL.Add(Format('UPDATE Tabulka2 SET Col1 = %d WHERE IdTabulka2 =
%d',
[10000, 123]));
ADOQuery.ExecSQL();

Odpovedá: Jan Sebelík

11. 11. 2002 15:47

> > honza@haes.cz 10.11.02 11:44 >>>
> >Vsechny komponenty tohoto typu (TQuery, TADOQuery, TADODataSet, TIBQuery,
TIBDataSet, TSQLQuery, TSQLDataSet) jsou konstruovany pro jeden prikaz.

> Odesílatel: Blazek Jaroslav <Jaroslav.Blazek@access-it.cz>
> tak to neni pravda
> ja bezne pouzivam ADOQuery nad MSSQL, kde mam vice selectu, insertu nebo
update....jen se musi spravne skombinovat
> prvni SELECT mas normalne v DataSource.DataSet a ostatni dostanes pomoci
metody NextRecordset()

No, diky za informaci, to jsem opravdu nevedel.
Jenom tedy fakt nevím, co bych pripojil na ten DataSource, pokud se mi bude
DataSet pod nim menit.

Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================

Odpovedá: Blazek Jaroslav

11. 11. 2002 17:16

Ahoj,

> honza@haes.cz 11.11.02 14:50 >>>
>No, diky za informaci, to jsem opravdu nevedel.
>Jenom tedy fakt nevím, co bych pripojil na ten DataSource, pokud se mi bude
DataSet pod nim menit.

prvni SELECT - Dataset (klasika DataSource.DataSet) se nemeni
jediny co se mi zdalo trochu neohrabany, je prave ziskani dalsich Datasetu
pomoci NextRecordset()
tak jsem si to trochu upravil

  private
   FOList:TObjectList;
   function FGetRecordSets(AIndex:integer):TADOQuery;
   function FGetRecordSetsCount:integer;
  public
   property RecordSets[Index:integer]:TADOQuery read FGetRecordSets;
   property RecordSetsCount:integer read FGetRecordSetsCount;

function TMyADOQuery.FGetRecordSets(AIndex:integer):TADOQuery;
begin
 Result := nil;
 if (AIndex < 0) or (AIndex >= FOList.Count) then
  exit;
 Result := TMyADOQuery(FOList.Items[AIndex]);
end;

function TMyADOQuery.FGetRecordSetsCount:integer;
begin
 Result := FOList.Count;
end;

procedure TMyADOQuery.Open();
var TmpRecordSet:_Recordset;
    Rows:integer;
begin
 inherited;
 TmpRecordSet := NextRecordset(Rows);
 while Assigned(TmpRecordSet) do
 begin
  FOList.Add(TADOQuery.Create(self));
  TADOQuery(FOList.Items[FOList.Count - 1]).Connection := Connection;
  TADOQuery(FOList.Items[FOList.Count - 1]).Recordset := TmpRecordSet;
  TADOQuery(FOList.Items[FOList.Count - 1]).First();
  TmpRecordSet := NextRecordset(Rows);
 end;
end;

a potom uz jen staci na nejake tlacitko na formulari prirazovat nejakemu
DataSource, ktery je napichlej treba na DBGrid
vyuziti je spousta...

const Index:integer = -1;
begin
 if MyADOQuery.RecordSetsCount > 0 then
 begin
  Inc(Index);
  if Index = MyADOQuery.RecordSetsCount then
   Index := 0;
  DataSource1.DataSet := MyADOQuery.RecordSets[Index];
 end
 else
  DataSource1.DataSet := nil;
end;

S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644